package arbres;

import listes.*;

public interface Arbre<E> {

	public E getVal(); // renvoie la valeur de la RACINE de l'arbre
	public E setVal(E e); // met Ã  jour la valeur de la racine de l'arbre et renvoie la valeur prÃ©cÃ©dente
	public boolean isLeaf(); // renvoie vrai si l'arbre est une feuille (racine sans enfants)
	public int familySize(); // renvoie le nombre de DESCENDANTS depuis la RACINE (racine exclue)
	public int height(); // renvoie la hauteur de l'arbre, Ã  partir de la RACINE
	public Arbre<E> father(); // renvoie le pÃ¨re de l'arbre ou null s'il n'existe pas.
	public Arbre<E> ancestor(); // renvoie le premier ancÃªtre de l'arbre
	public Liste<? extends Arbre<E>> children(); // renvoie la liste des enfants de la racine.
	public Liste<? extends Arbre<E>> ancestors(); // renvoie la liste des aieux de l'arbre
	public Liste<? extends Arbre<E>> brothers(); // renvoie la liste des frÃ¨res de l'arbre.
	public Liste<? extends Arbre<E>> gen(int n); // renvoie la liste des dÃ©scendants de la racine Ã  la n^Ã¨me gÃ©nÃ©ration.
	public boolean contains(Arbre<E> a); // renvoie vrai si a est un sous-arbre de l'instance courante,
	public Liste<? extends Arbre<E>> cutAll(); // supprime tous les enfants ; renvoie les orphelins (mis Ã  jours !)
	public Arbre<E> cutChild(int i) throws IndexOutOfBoundsException;
		// renvoie ET SUPPRIME le fils nÂ°i (Ã  partir du fils nÂ°0 le plus Ã  gauche)
	public Arbre<E> getChild(int i) throws IndexOutOfBoundsException; 
		// renvoie le fils nÂ°i (Ã  partir du fils nÂ°0 le plus Ã  gauche)
	public Arbre<E> addChild(Arbre<E> a) throws NullPointerException, ArbreCyclique, GreffeDeSousArbre, SousArbreIncoherent;
		// rajoute un fils Ã  la racine A DROITE des Ã©ventuels fils dÃ©jÃ  existants ;
		// renvoie l'instance courante ;
		// ATTENTION :
		//   1) a doit exister (sinon : NullPointerException)
		//   2) a ne doit pas avoir de pÃ¨re (sinon : GreffeDeSousArbre)
		//   3) a ne doit pas contenir l'instance courante (sinon : ArbreCyclique)
		//   4) a doit Ãªtre implÃ©mentÃ© comme l'instance courante (sinon : SousArbreIncoherent)
	public Arbre<E> addChild(int i, Arbre<E> a) throws NullPointerException,
			IndexOutOfBoundsException, ArbreCyclique, GreffeDeSousArbre, SousArbreIncoherent;
		// rajoute un fils nÂ°i et dÃ©clale les fils existants vers la droite ;
		// (i est compris entre 0 et children() inclu, auquel cas l'arbre est rajoutÃ© Ã  la fin) ;
		// renvoie l'instance courante ;
		// ATTENTION :
		//   1) a doit exister (sinon : NullPointerException)
		//   2) a ne doit pas avoir de pÃ¨re (sinon : GreffeDeSousArbre)
		//   3) a ne doit pas contenir l'instance courante (sinon : ArbreCyclique)
		//   4) a doit Ãªtre implÃ©mentÃ© comme l'instance courante (sinon : SousArbreIncoherent)
		//   5) i doit Ãªtre un indice possible (sinon : IndexOutOfBoundsException)
	public Liste<E> prefixe(); // renvoie la liste des Ã©lÃ©ments stockÃ©s dans l'arbre
		// dans l'ordre correspondant Ã  son parcours prÃ©fixe
	public Liste<E> postfixe(); // renvoie la liste des Ã©lÃ©ments stockÃ©s dans l'arbre
		// dans l'ordre correspondant Ã  son parcours postfixe
	public Liste<E> largeur(); // renvoie la liste des Ã©lÃ©ments stockÃ©s dans l'arbre
		// niveau par niveau Ã  partir de la racine
}
